package com.itrh.org.util;

import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * ClassName: ScanUtil
 *
 * @author XHU_WHY
 * @version V1.0
 * @since 2024/4/7 17:14
 */
@Slf4j
public class ScanUtil {
    public static List<Class<?>> scan(String packagePath) {
        log.info("------------ScanUtil开始工作------------");
        // 1.去除空格
        packagePath = packagePath.replaceAll("\\s*", "");
        // 2.得到所有的包名
        String[] packageNames = packagePath.split(",");
        List<Class<?>> classList = new ArrayList<>();
        for (String packageName : packageNames) {
            // 3.得到包名对应的文件路径
            String packageDirName = packageName.replaceAll("\\.", "/");
            // 4.得到类加载器
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            // 5.得到包名对应的文件路径
            String packageDir = Objects.requireNonNull(classLoader.getResource(packageDirName)).getFile();
            // 6.得到包名对应的所有controller文件
            File[] files = new File(packageDir).listFiles(file -> file.getName().endsWith(".class"));
            if (files != null && files.length > 0) {
                for (File file : files) {
                    // 7.得到类名
                    String className = file.getName().replace(".class", "");
                    // 8.得到类全名
                    String fullClassName = packageName + "." + className;
                    try {
                        // 9.得到类
                        Class<?> clazz = classLoader.loadClass(fullClassName);
                        // 10.添加到类集合中
                        classList.add(clazz);
                    } catch (Exception e) {
                        log.error("扫描类异常", e);
                    }
                }
            }
        }
        log.info("------------ScanUtil工作结束------------");
        return classList;
    }
}
